# 导入 sqlite3 模块，这是 Python 标准库中用于操作 SQLite 数据库的部分。
import sqlite3

# 调用 connect 函数，连接到名为 "example.db" 的数据库。
# 如果这个数据库文件不存在，SQLite 会自动在当前目录下创建它。
# conn 是一个 Connection 对象，代表了你和数据库之间的连接。
conn=sqlite3.connect("example.db")

# 从连接对象 (conn) 创建一个 Cursor (游标) 对象。
# 游标是执行 SQL 命令和处理查询结果的主要工具。你可以把它想象成在文本中闪烁的光标。
c=conn.cursor()

# 使用游标的 execute 方法执行一条 SQL 语句。
# 这条语句是 "CREATE TABLE trans(...)"，它的作用是创建一个名为 "trans" (transaction, 交易) 的表。
# 括号内定义了表的列：
#   data: 文本类型 (text)，用于存储日期
#   flag: 文本类型 (text)，用于存储操作类型 (如 'BUY')
#   symbol: 文本类型 (text)，用于存储股票名称 (如 '中国银行')
#   qty: 实数类型 (real)，用于存储数量
#   price: 实数类型 (real)，用于存储价格
# 注意：如果这个表已经存在，再次运行此代码会报错。更稳妥的写法是 "CREATE TABLE IF NOT EXISTS trans(...)"
c.execute("CREATE TABLE if not exists trans(data text,flag text,symbol text,qty real,price real)")

# 再次使用 execute 方法，执行 "INSERT INTO ..." SQL 语句。
# 这条语句的作用是向 "trans" 表中插入一条新的记录 (一行数据)。
# VALUES(...) 中的值与上面创建表时定义的列一一对应。
c.execute("INSERT INTO trans VALUES('2020-09-10','BUY','中国银行',10,3.19)")

# 执行 "SELECT * FROM trans" SQL 语句。
#   SELECT: 查询数据
#   *: 代表“所有列”
#   FROM trans: 从 "trans" 表中查询
# 整个语句的意思是：从 "trans" 表中查询出所有的记录。
# c.execute(...) 在执行 SELECT 后会返回一个可迭代的对象，其中包含了所有查询结果。
# for row in ...: 这是一个 for 循环，它会遍历查询结果中的每一行。
for row in c.execute("SELECT * FROM trans"):
    # 在循环内部，`row` 变量在每一次迭代中都会被赋值为表中的一行数据。
    # 这一行数据是一个 Python 元组 (tuple)。
    # print(row) 会将这一行数据打印到控制台。
    print(row)

# 提交事务。
# 对数据库做的所有修改（比如这里的 CREATE TABLE 和 INSERT）都属于一个“事务”。
# 调用 commit() 方法才会将这些修改真正地、永久地保存到数据库文件中。
# 如果没有这一步，当程序结束时，所有更改都会丢失。
conn.commit()

# 关闭数据库连接。
# 在完成所有数据库操作后，调用 close() 方法是一个好习惯。
# 这会释放数据库文件锁和相关资源。
conn.close()